package com.ag.oa.core.service;

import com.ag.oa.core.entity.vo.SkillVO;
import com.ag.oa.core.entity.vo.UserVO;
import com.alibaba.fastjson.JSONObject;

import java.util.List;
import java.util.Map;

public interface UserService {

    void saveWxUserAuthRegister(String code, JSONObject res);

    void saveAuthRegisterUserInfo(String openId, String userInfoStr, JSONObject res);

    /**
     * 老用户，完善用户信息
     * @param openId
     * @param username
     * @param phone
     * @param smsCode
     * @param res
     */
    void saveCompleteUser(String openId, String username, String phone, String smsCode, JSONObject res);

    /**
     * 新用户，注册 或者 绑定手机号
     * @param openId
     * @param username
     * @param phone
     * @param smsCode
     * @param res
     */
    void saveNewUser(String openId, String username, String phone, String smsCode, JSONObject res);

    void updateAuthUserInfo(String openId, String encryptedStr, String ivStr, String sessionKey
            , String rawDataStr, JSONObject res);

    UserVO getUserInfoById(Integer id, String openId);

    List<UserVO> getForPageList(Integer id, String username, Integer page, Integer pageSize);

    void updateModifyUserInfo(Integer userId, String valueStr, Integer colType, JSONObject res);

    List<UserVO> queryUsersDataByUsername(Integer userId, String username);

    int saveUpdateRefereeUser(Integer userId, Integer refereeUserId);

    void updateUserVipLevel(Integer userId, Integer vipLevel);

    List<SkillVO> getUserWorkSkillList(Integer id);

    boolean getUserHasAuthAddTask(Integer userId, Integer projectId);

    List<Map<String, Object>> getUserScoreRecordList(Integer userId, Integer page, Integer pageSize);

    /**
     * 支出积分
     * 严格校验，扣款只一次，失败直接返回
     *
     * @param userId 交易用户id
     * @param transactionScore 交易积分
     * @param updated 交易时间
     * @param createdBy 操作人id
     * @param sourceType 来源类型（0：后台管理员直接维护 1：完成任务 2：每日打卡 3：分享文件 4：下载资源 5：举报奖励 ...）
     * @param additionalJson 附加信息json字符串（相同来源类型，json格式保持一致，内容可以考虑可追溯性，例如完成任务的项目id之类）
     * @param description 备用描述
     * @return
     */
    boolean doUserOutScore(Integer userId, Integer transactionScore, String updated,
                         Integer createdBy, Integer sourceType, String additionalJson, String description);

    /**
     * 收入积分
     * 增加放宽限制，为了健壮性，尝试3次
     *
     * @param userId 交易用户id
     * @param transactionScore 交易积分
     * @param updated 交易时间
     * @param createdBy 操作人id
     * @param sourceType 来源类型（0：后台管理员直接维护 1：完成任务 2：每日打卡 3：分享文件 4：下载资源 5：举报奖励 ...）
     * @param additionalJson 附加信息json字符串（相同来源类型，json格式保持一致，内容可以考虑可追溯性，例如完成任务的项目id之类）
     * @param description 备用描述
     * @return
     */
    boolean doUserInScore(Integer userId, Integer transactionScore, String updated,
                        Integer createdBy, Integer sourceType, String additionalJson, String description);

    int getCountByPhone(String phone);

    void updatePublicStatusByUserId(Integer userId, Integer publicStatus);

}
